﻿using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;

namespace RC.ControlAcceso.ObjetosNegocio
{
    public class CA2HistoricoTarjeta
    {
        #region Atributos
        protected int _idHistoricoTarjeta;
        protected int _idVisita;
        protected int _idTarjeta;
        protected DateTime _fechaAsignacion;
        protected DateTime _fechaDesAsignacion;
        protected int _idPersonal;        
        #endregion

        #region Propiedades
        public int IdHistoricoTarjeta
        {
            get
            {
                return _idHistoricoTarjeta;
            }
            set
            {
                _idHistoricoTarjeta = value;
            }
        }
        public int IdVisita
        {
            get
            {
                return _idVisita;
            }
            set
            {
                _idVisita = value;
            }
        }
        public int IdTarjeta
        {
            get
            {
                return _idTarjeta;
            }
            set
            {
                _idTarjeta = value;
            }
        }
        public DateTime FechaAsignacion
        {
            get
            {
                return _fechaAsignacion;
            }
            set
            {
                _fechaAsignacion = value;
            }
        }
        public DateTime FechaDesAsignacion
        {
            get
            {
                return _fechaDesAsignacion;
            }
            set
            {
                _fechaDesAsignacion = value;
            }
        }
        public int IdPersonal
        {
            get
            {
                return _idPersonal;
            }
            set
            {
                _idPersonal = value;
            }
        }
        
        //Propiedades derivadas
        
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private CAHistoricoTarjetaTableAdapter _historicoTarjetaAD;
        protected CAHistoricoTarjetaTableAdapter Adaptador
        {
            get
            {
                if (_historicoTarjetaAD == null)
                    _historicoTarjetaAD = new CAHistoricoTarjetaTableAdapter();

                return _historicoTarjetaAD;
            }
        }
        protected static CA2HistoricoTarjeta ObtenerPorID(int pIDidHistoricoTarjeta)
        {
            CA2HistoricoTarjeta _historicoTarjeta = null ;

            GestionHoraria.CAHistoricoTarjetaDataTable _dt;

            // obtengo el elemento por ID
            CAHistoricoTarjetaTableAdapter _adaptador = new CAHistoricoTarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerPorID(pIDidHistoricoTarjeta);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
                _historicoTarjeta = AsignarRowAObjeto((GestionHoraria.CAHistoricoTarjetaRow)_dt.Rows[0]);
            
            return _historicoTarjeta;
        }
        protected static CA2HistoricoTarjeta AsignarRowAObjeto(GestionHoraria.CAHistoricoTarjetaRow pRow)
        {
            CA2HistoricoTarjeta _historicoTarjeta = null;
            if (pRow != null)
            {
                _historicoTarjeta = new CA2HistoricoTarjeta();
                _historicoTarjeta.IdHistoricoTarjeta = pRow.idHistoricoTarjeta;
                try { _historicoTarjeta.IdVisita = pRow.idVisita; }
                catch { _historicoTarjeta.IdVisita = 0; }
                try { _historicoTarjeta.IdTarjeta = pRow.idTarjeta; }
                catch { _historicoTarjeta.IdTarjeta = 0; }
                try { _historicoTarjeta.FechaAsignacion = pRow.FechaAsignacion; }
                catch { _historicoTarjeta.FechaAsignacion = CA2Parametros.FechaMinima; }
                try { _historicoTarjeta.FechaDesAsignacion = pRow.FechaDesasignacion; }
                catch { _historicoTarjeta.FechaDesAsignacion = CA2Parametros.FechaMinima; }
                try { _historicoTarjeta.IdPersonal = pRow.idPersonal; }
                catch { _historicoTarjeta.IdPersonal = 0; }                
            }
            return _historicoTarjeta;
        }
        protected CA2HistoricoTarjeta InsertarDAL(int pIdVisita, int pIdTarjeta, DateTime pFechaAsignacion, DateTime pFechaDesAsignacion, int pIdPersonal)
        {
            IdHistoricoTarjeta = int.Parse(Adaptador.Insertar(pIdVisita, pIdTarjeta, pFechaAsignacion, pFechaDesAsignacion, pIdPersonal).ToString());
            return this;
        }
        protected bool ActualizarDAL(int pidHistoricoTarjeta, int pIdVisita, int pIdTarjeta, DateTime pFechaAsignacion, DateTime pFechaDesAsignacion, int pIdPersonal)
        {
            if (0 < Adaptador.Actualizar(pIdVisita, pIdTarjeta, pFechaAsignacion, pFechaDesAsignacion, pIdPersonal, IdHistoricoTarjeta))
                return true;
            else
                return false;
        }
        public static CA2HistoricoTarjetaColeccion ObtenerHistoricoDePersonal(int pIdPersonal)
        {
            GestionHoraria.CAHistoricoTarjetaDataTable _dt;

            CAHistoricoTarjetaTableAdapter _adaptador = new CAHistoricoTarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerHistoricoDePersonal(pIdPersonal);

            return AsignarHistoricoTarjetaTableAdapterAHistoricoTarjetaColeccion(_dt);

        }
        public static CA2HistoricoTarjetaColeccion ObtenerPorPersonalEntreFechasHistoricoDePersonal(int pIdPersonal, DateTime pFechaDesde, DateTime pFechaHasta)
        {
            GestionHoraria.CAHistoricoTarjetaDataTable _dt;

            CAHistoricoTarjetaTableAdapter _adaptador = new CAHistoricoTarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerTarjetasDePersonalEntreFechas(pFechaDesde, pFechaHasta, pIdPersonal);

            return AsignarHistoricoTarjetaTableAdapterAHistoricoTarjetaColeccion(_dt);

        }
        protected static CA2HistoricoTarjetaColeccion AsignarHistoricoTarjetaTableAdapterAHistoricoTarjetaColeccion(GestionHoraria.CAHistoricoTarjetaDataTable pDataTable)
        {
            CA2HistoricoTarjetaColeccion _historicoTarjetas = new CA2HistoricoTarjetaColeccion();
            CA2HistoricoTarjeta _historicoTarjeta;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (GestionHoraria.CAHistoricoTarjetaRow _row in pDataTable.Rows)
                {
                    _historicoTarjeta = AsignarRowAObjeto(_row);
                    if (_historicoTarjeta != null)
                        _historicoTarjetas.Add(_historicoTarjeta);
                }
            }
            return _historicoTarjetas;
        }
        
        #endregion

        #region Métodos
        public CA2HistoricoTarjeta()
        {
            AsignarValoresIniciales();
        }        

        public void AsignarValoresIniciales()
        {
            IdHistoricoTarjeta = -1;
            IdVisita = -1;
            IdTarjeta = 0;
            FechaAsignacion = CA2Parametros.FechaMinima;
            FechaAsignacion = CA2Parametros.FechaMinima;
            IdPersonal = -1;
        }

        public static CA2HistoricoTarjeta CrearHistoricoTarjeta()
        {
            CA2HistoricoTarjeta _historicoTarjeta = new CA2HistoricoTarjeta();
            _historicoTarjeta.AsignarValoresIniciales();
            return _historicoTarjeta;
        }
        public static CA2HistoricoTarjeta CrearHistoricoTarjeta(int pID)
        {
            CA2HistoricoTarjeta _historicoTarjeta = ObtenerPorID(pID);
            return _historicoTarjeta;
        }
        public CA2HistoricoTarjeta Insertar()
        {
            return InsertarDAL(IdVisita, IdTarjeta, FechaAsignacion, FechaDesAsignacion, IdPersonal);
        }
        public bool Actualizar()
        {
            return ActualizarDAL(IdHistoricoTarjeta, IdVisita, IdTarjeta, FechaAsignacion, FechaDesAsignacion, IdPersonal);
        }
        public void Eliminar()
        {
            if (this.IdHistoricoTarjeta > 0)
            {
                CA2HistoricoTarjeta _historicoTarjeta = CA2HistoricoTarjeta.CrearHistoricoTarjeta(this.IdHistoricoTarjeta);                
                _historicoTarjeta.Eliminar();
            }            
        }
        #endregion

        #region Metodos para datasource
        public void Actualizar(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            if (pHistoricoTarjeta != null)
                pHistoricoTarjeta.Actualizar();
        }
        public CA2HistoricoTarjeta Insertar(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            if (pHistoricoTarjeta != null)
                return pHistoricoTarjeta.Insertar();
            return null;
        }
        public void Eliminar(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            pHistoricoTarjeta.Eliminar();
            pHistoricoTarjeta = null;
        }
        #endregion
    }
    public class CA2HistoricoTarjetaColeccion : System.Collections.CollectionBase
    {
        public CA2HistoricoTarjeta UltimoHistoricoTarjeta()
        {
            CA2HistoricoTarjeta _ultimoHistorico =CA2HistoricoTarjeta.CrearHistoricoTarjeta(); //obtengo el sintarjeta por defecto
            DateTime _ultimaFecha = CA2Parametros.FechaMinima;

            foreach (CA2HistoricoTarjeta _ht in this)
            {
                if (_ht.FechaAsignacion >= _ultimaFecha)
                {
                    _ultimaFecha = _ht.FechaAsignacion;
                    _ultimoHistorico = _ht;
                }
            }

            return _ultimoHistorico;
        }
        public int UltimoNumeroDeTarjeta()
        {
            return UltimoHistoricoTarjeta().IdTarjeta;
        }
        public void Add(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            this.List.Add(pHistoricoTarjeta);
        }
        public void AddUnico(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            foreach (CA2HistoricoTarjeta _historicoTarjeta in this)
                if (pHistoricoTarjeta.IdHistoricoTarjeta == _historicoTarjeta.IdHistoricoTarjeta)
                    return;
            this.List.Add(pHistoricoTarjeta);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(CA2HistoricoTarjeta pHistoricoTarjeta)
        {
            for(int i = 0; i < this.Count; i++)
            {
                if (this[i].IdHistoricoTarjeta == pHistoricoTarjeta.IdHistoricoTarjeta)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public CA2HistoricoTarjeta this[int index]
        {
            get { return ((CA2HistoricoTarjeta)(this.List[index])); }
            set { this.List[index] = value; }
        }
        /// <summary>
        /// Este metodo solo se puede llamar teniendo la persona
        /// </summary>
        /// <param name="pNumeroTarjetaNuevo"></param>
        /// <param name="pIdPersonal"></param>
        /// <param name="pIdVisita"></param>
        public void GenerarHistoricoDeTarjeta(int pNumeroTarjetaNuevo, int pNumeroTarjetaAnterior, int pIdPersonal, int pIdVisita, bool pEsNuevo)
        {
            CA2HistoricoTarjeta __historicoTarjeta;
            CA2Tarjeta _tarjeta;

            if (pNumeroTarjetaAnterior < 0)
                pNumeroTarjetaAnterior = 0;

            if (pNumeroTarjetaNuevo < 0)
                pNumeroTarjetaNuevo = 0;

            if (pNumeroTarjetaAnterior == pNumeroTarjetaNuevo)
                return; //son iguales, no tengo que modificar nada

            if (pEsNuevo == true)
            { //genero la primer asignación y 
                __historicoTarjeta = new CA2HistoricoTarjeta();
                __historicoTarjeta.IdVisita = pIdVisita;
                __historicoTarjeta.IdTarjeta = pNumeroTarjetaNuevo;
                __historicoTarjeta.FechaAsignacion = DateTime.Now;
                __historicoTarjeta.FechaDesAsignacion = DateTime.Parse("01/01/1900");
                __historicoTarjeta.IdPersonal = pIdPersonal;
                __historicoTarjeta.Insertar();
                this.Add(__historicoTarjeta);

                _tarjeta = CA2Tarjeta.CrearTarjeta(pNumeroTarjetaNuevo);
                _tarjeta.Estado = 1; //la pongo como que esta asignada. Si es la tarjeta con numero 0, no se modifica(eso lo hace automaticamente)
                _tarjeta.Actualizar();

                return;
            }

            ////////////////////////////////////////////////////////////
            // TARJETA ANTERIOR
            if (pNumeroTarjetaAnterior != UltimoNumeroDeTarjeta())
            {   //significa que tenia tarjeta asignada pero no tenia un HT creado
                //tegno que crearle el HT desde el inicio hasta el dia de hoy para la tarjeta vieja
                __historicoTarjeta = new CA2HistoricoTarjeta();
                __historicoTarjeta.IdVisita = pIdVisita;
                __historicoTarjeta.IdTarjeta = pNumeroTarjetaAnterior;
                __historicoTarjeta.FechaAsignacion = DateTime.Parse("01/01/1900") ;
                __historicoTarjeta.FechaDesAsignacion = DateTime.Now;
                __historicoTarjeta.IdPersonal = pIdPersonal;
                __historicoTarjeta.Insertar();
                this.Add(__historicoTarjeta);
            }

            //cierro el ultimo HT
            CA2HistoricoTarjeta _ultimoHT = UltimoHistoricoTarjeta();
            _ultimoHT.FechaDesAsignacion = DateTime.Now;
            _ultimoHT.Actualizar();

            //libero la tarjeta anterior
            _tarjeta = CA2Tarjeta.CrearTarjeta(pNumeroTarjetaAnterior);
            _tarjeta.Estado = 0; //la pongo como que esta libre.
            _tarjeta.Actualizar();
            /// FIN TARJETA ANTERIOR
            ////////////////////////////////////////////////////////////////////////
 

            ////////////////////////////////////////////////////////////////////
            /// TARJETA NUEVA
            //creo el nuevo HT
            __historicoTarjeta = new CA2HistoricoTarjeta();
            __historicoTarjeta.IdVisita = pIdVisita;
            __historicoTarjeta.IdTarjeta = pNumeroTarjetaNuevo;
            __historicoTarjeta.FechaAsignacion = DateTime.Now;
            __historicoTarjeta.FechaDesAsignacion = DateTime.Parse("01/01/1900");
            __historicoTarjeta.IdPersonal = pIdPersonal;
            __historicoTarjeta.Insertar();
            this.Add(__historicoTarjeta);
            
            ///pongo la tarjeta como asignada
            _tarjeta = CA2Tarjeta.CrearTarjeta(pNumeroTarjetaNuevo);
            _tarjeta.Estado = 1; //la pongo como que esta libre.
            _tarjeta.Actualizar();
            /// FIN TARJETA NUEVA
            ///////////////////////////////////////////////////////////////////
        }
        #region Para datasource
        public static CA2HistoricoTarjetaColeccion ObtenerHistoricoTarjetaPorID(int pidHistoricoTarjeta)
        {
            CA2HistoricoTarjetaColeccion _resultado = null;
            CA2HistoricoTarjeta _historicoTarjeta = CA2HistoricoTarjeta.CrearHistoricoTarjeta(pidHistoricoTarjeta);
            if (_historicoTarjeta != null)
            {
                _resultado = new CA2HistoricoTarjetaColeccion();
                _resultado.Add(_historicoTarjeta);
            }

            return _resultado;
        }
        public static CA2HistoricoTarjetaColeccion ObtenerHistoricoTarjetaPorIDPersonal(int pIdPersonal)
        {
            CA2HistoricoTarjetaColeccion _resultado = new CA2HistoricoTarjetaColeccion();
            _resultado = CA2HistoricoTarjeta.ObtenerHistoricoDePersonal(pIdPersonal);            
            return _resultado;
        }        
        #endregion
    }
}
